#ifndef HTTP_REQUEST_H
#define HTTP_REQUEST_H

#include <unordered_map>
#include <unordered_set>
#include <string>
#include <regex>
#include <errno.h>     
#include <mysql/mysql.h>  //mysql

#include "../buffer/buffer.h"
#include "../log/log.h"
#include "../pool/sqlconnpool.h"
#include "../pool/sqlconnRAII.h"

class HttpRequest {
public:
    enum PARSE_STATE {
        REQUEST_LINE, //正在解析请求首行
        HEADERS, //正在解析请求头
        BODY, //正在解析请求体
        FINISH,     //解析完成
    };

    enum HTTP_CODE {
        NO_REQUEST = 0,
        GET_REQUEST,
        BAD_REQUEST,
        NO_RESOURSE,
        FORBIDDENT_REQUEST,
        FILE_REQUEST,
        INTERNAL_ERROR, //内部错误
        CLOSED_CONNECTION,
    };
    
    HttpRequest() { Init(); }
    ~HttpRequest() = default;

    void Init();
    bool parse(Buffer& buff);

    std::string path() const;
    std::string& path();
    std::string method() const;
    std::string version() const;
    std::string GetPost(const std::string& key) const;
    std::string GetPost(const char* key) const;

    bool IsKeepAlive() const;


private:
    bool ParseRequestLine_(const std::string& line); //解析请求首行
    void ParseHeader_(const std::string& line); //解析请求头
    void ParseBody_(const std::string& line); //解析请求体

    void ParsePath_(); //解析请求路径
    void ParsePost_(); //解析post请求
    void ParseFromUrlencoded_(); //解析表单数据

    static bool UserVerify(const std::string& name, const std::string& pwd, bool isLogin); //验证用户

    PARSE_STATE state_; //当前解析状态
    std::string method_, path_, version_, body_; //请求方法。请求路径，协议版本，请求体（请求报文中解析到的信息）
    std::unordered_map<std::string, std::string> header_; //请求头
    std::unordered_map<std::string, std::string> post_; //post请求表单数据

    static const std::unordered_set<std::string> DEFAULT_HTML; //默认网页
    static const std::unordered_map<std::string, int> DEFAULT_HTML_TAG; //默认HTML标签
    static int ConverHex(char ch); //转换进制
};


#endif //HTTP_REQUEST_H